6
תגובות
עלתה לי שאלה איך הכי כדאי לבדוק התחברות ?
מבחינת בטיחות, מהירות ומה שתרצו

יש אפשרות ראשונה : להשוות אימייל וסיסמה מגובבת (אל תתייחסו לתקינות\בטיחות\אם הפקודה תעבוד אלא לרעיון)

[code]
$pass = md5($pass);
$db->query("select * where email = $email and pass = $pass");
[/code]

אם אני אקבל משו שהוא לא NULL - הכל טוב ויפה

אפשרות שנייה : אותו רעיון, רק עם COUNT
[code] $pass = md5($pass);
$db->query("select count(*) where email = $email and pass = $pass");[/code]

אפשרות שלישית : לקבל את הסיסמה ואז לגבב\מה שבאלנו ואז להשוות
[code] $pass = $db->query("select pass where email = $email");
$pass = md5($pass);
[/code]
אם יש לכם עוד אפשרות ומשו יותר יעיל ובטיחותי אשמח לשמוע על כך :)

אז מה לדעתכם יותר כדאי ?

6 תשובות

avatar ענה Splash ב 28 לספטמבר 2014 #

אפשר להגיד שהאפשרות הראשונה היא ההכי פחות נכונה משום שאתה סתם שולף נתונים שאין לך שימוש בהם.[אלה אם יש לך שימוש ולא ציינת]
מבחינת מהירות כדאי להוסיף limit 1 בשאילתה על מנת שהוא לא סתם ימשיך לחפש תוצאות אחרי שהוא סיים.
ומבחינת אבטחה לא מומלץ להשתמש יותר ב-md5 יש לך מדריך לאיך לעבוד נכון עם סיסמאות

avatar ענה intval ב 28 לספטמבר 2014 #

מבחינה טכנית האופציה השניה עדיפה, בהיותה הכי מהירה ובוודאות עדיפה על הדרך הראשונה

בפרויקטים שלי אני משתמש באופציה השלישית, כדי להציג הודעות שגיאה מתאימות יותר. מבחינתי הודעת שגיאה שאומרת "שם משתמש שגוי" או "סיסמה שגויה" עדיפה יותר מאשר "שם משתמש או סיסמה לא נכונים" כי זה עוזר למשתמשים להבין מה בדיוק הבעיה ומגדיל את הסיכוי שהם יתקנו את הבעיה במקום שיעזבו את האתר.

וגם שים לב לזה

נ.ב. אני רואה שsplash ענה מהר יותר :)
נ.נ.ב, במקום limit עדיף להוסיף unique index על עמודת אימייל, ככה גם החיפוש יהיה מהיר ויעצור אחרי ששורה אחת תמצא וגם המסד לא יאפשר לשני משתמשים עם אותו אימייל להירשם

avatar ענה משהה ב 28 לספטמבר 2014 #

תודה רבה על התשובות :)
כן ברור שMD5 לא בטיחותי זה היה רק בשביל הדוגמה
אז בקיצור השני עדיף מבחינת יעילות והשלישי מבחינת חווית משתמש :)
בנוגע לLIMIT והUNIQUE INDEX - איך אני גורם לאימייל להיות בלעדי ? זאת אומרת שיהיה אפשר להירשם רק עם אימייל אחד?
לעשות בדיקה שתעבור על כל הרשומות זה לא נראה לי אפקטיבי .. במקרה של מיליון רשומות זה עומס מיותר על השרת
יש לכם פתרון ?

avatar ענה Splash ב 28 לספטמבר 2014 #

יש לך באתר מדריך גם על מפתחות בטבלאות אבל בעקרון כן,אתה אמור בנוסף למפתח unique לבדוק אם האימייל כבר קיים באמצעות שאילתה,אין לך מה לדאוג המסד מתוכנן ככה שאם יש עליו מפתח החיפוש מתבצע מהר גם כאשר מדובר בכמה מיליונים של שורות.

ואלכס אני אישית אף פעם לא סומך על זה שהמסד עושה את זה בשבילי ותמיד מוסיף limit 1 כאשר אני רוצה שרק שורה אחת תשלף

avatar ענה משהה ב 28 לספטמבר 2014 #

לפי המדריך, את השדה אימייל לעשות כPRIMARY KEY או כUNIQUE INDEX שהרי הם אותו דבר בעצם חח
ואיך לעשות את השאילתת חיפוש הזאת? select count(*) from users where email = [email protected]
וכשזה גדול מ0 אז האימייל קיים ? או שיש שיטה יותר מהירה?

avatar ענה Splash ב 29 לספטמבר 2014 #

שאלה מאוד נפוצה ומשום מה לא כלולה במדריך.
ישנם שני הבדלים בין "יחודי" ל"מפתח ראשי"
קודם כל,מפתח ראשי לא מסוגל להכיל null בעוד "יחודי" כן[פעם אחת], והיותר חשוב המפתח הראשי הוא בעצם מה שמאפיין את השורה הזאת.לכן גם ניתן להוסיף רק מפתח ראשי אחד בטבלה בעוד שמפתחות יחודיים אתה יכול להוסיף כראות עינייך
אימייל לא יכול להיות מפתח ראשי משום שמשתמש יכול לשנות את האימייל שלו ולכן הוא לא מה שמייצג לנו את העמודה,מה שכן אמור לייצג את העמודה זה ID מסויים שאינו אמור להשתנות.

לגבי שטת בדיקה,עושים זאת בדרך שציינת.